package com.ray.activiti.service;


import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import com.ray.activiti.common.page.Page;
import com.ray.activiti.dto.ProcessNodeDto;
import com.ray.activiti.dto.ProcessTaskDto;
import com.ray.activiti.table.entity.ExtendActModel;
import com.ray.activiti.table.entity.ExtendActNodeset;
import com.ray.activiti.vo.ActNode;
import com.zjhc.flyhong.common.function.operator.LoginUser;

/**
 * 类的功能描述.
 * activiti模型接口类
 * @Auther ray  qray686898@163.com
 * @Date 2017/12/28
 * @代码参考或来自  https://github.com/huangxianyuan/hxyFrame
 */

public interface ActModelerService {
    /**
     * 创建模型
     * @param extendActModelEntity
     * @return
     */
    String CreateModeler(ExtendActModel extendActModelEntity,LoginUser user) throws  Exception;

    /**
     *获取流程图所有节点和连线
     * @param modelId 模型id
     * @return
     */
    List<Map<String,String>> getflows(String contentPath,String modelId) throws Exception;

    /**
     * 查看流程图片
     * @param modelId
     * @return
     */
    byte[] showFlowImg(String modelId);

    /**
     * 根据流程key 获取业务可用的流程
     * @param actKey
     * @return
     */
    List<Map<String,Object>> queryFlowsByActKey(String actKey,LoginUser user);

    /**
     * 获取流程第一个节点信息
     * @param deployId
     * @return
     */
    ActNode getStartFlowInfo(String deployId) throws IOException;


    /**
     * 启动流程
     * @param processTaskDto
     */
    void startFlow(ProcessTaskDto processTaskDto,ActNode node,LoginUser user) throws Exception;
    /**
     * 启动流程 并执行第一个任务
     * @param processTaskDto
     * @param startNode
     * @param user
     */
    void startFlowAndExeNextTask(ProcessTaskDto processTaskDto,ActNode startNode,LoginUser user)throws Exception; 

    /**
     * 根据流程实例id查询实时的流程图
     * @param processInstanceId
     * @return
     */
    InputStream getFlowImgByInstantId(String processInstanceId);

    /**
     * 我的待办列表
     * @param params
     * @param pageNum
     * @return
     */
    Page<ProcessTaskDto> findMyUpcomingPage(Map<String,Object> params, int pageNum,LoginUser user);

    /**
     * 我的代办条数
     * @return
     */
    int myUpcomingCount(LoginUser user);


    /**
     * 我的已办列表
     * @param params
     * @param pageNum
     * @return
     */
    Page<ProcessTaskDto> myDonePage(Map<String,Object> params, int pageNum,LoginUser user);



    /**
     * 根据流程节点id 获取流程下一流向节点集合
     * @param processTaskDto
     * @return
     */
    List<ProcessNodeDto> getNextActNodes(ProcessTaskDto processTaskDto);

   
    /**
     * 办理任务
     * @param processTaskDto
     * @param params
     */
    void doActTask(ProcessTaskDto processTaskDto,Map<String,Object> params,LoginUser user) throws Exception;

    /**
     * 驳回到流程上一步
     * @param processTaskDto
     */
    void backPreviousNode(ProcessTaskDto processTaskDto,LoginUser user) throws Exception;

    /**
     * 
     * @param processTaskDto
     * @param map
     */
    void backStartUser(ProcessTaskDto processTaskDto,Map<String,Object> map,LoginUser user) throws Exception;
    /**
     *不同意,直接结束流程
     */
    void stopFlow(ProcessTaskDto processTaskDto,Map<String,Object> map,LoginUser user) throws Exception;
    /**
     * 转办
     * @param processTaskDto
     * @param toUserId 被转办人
     */
    void turnToDo(ProcessTaskDto processTaskDto,String toUserId,LoginUser user);
    /**
     * 同任务ID获取当前节点扩展信息
     * @param taskId
     * @return
     */
	ExtendActNodeset getNodeSetByTaskId(String taskId);
    
    /**
     * 判断是否有上级节点
     * @param processTaskDto
     * @param user
     * @return
     * @throws Exception
     */
	boolean hasPreNode(ProcessTaskDto processTaskDto,LoginUser user) throws Exception;






}
